#include <iostream>
#include <queue>
#include <vector>
using namespace std;

typedef pair<int, int> pii;
class Solution {
   public:
    int eatenApples(vector<int>& apples, vector<int>& days) {
        int res = 0;
        priority_queue<pii, vector<pii>, greater<pii>> pq;
        int n = apples.size();
        // i为当前的日期
        int i = 0;
        while (i < n) {
            // 当苹果的日期都比当前的日期早，说明都过期了，全部扔掉
            while (!pq.empty() && pq.top().first <= i) {
                pq.pop();
            }
            // 过期的日期
            int rottenDay = i + days[i];
            // 该日期腐烂的苹果个数
            int count = apples[i];
            // 放到优先队列里面
            if (count > 0) {
                pq.emplace(rottenDay, count);
            }
            // 每天吃一个苹果
            if (!pq.empty()) {
                pii curr = pq.top();
                pq.pop();
                curr.second--;
                // 如果还有苹果，放回去继续吃。
                if (curr.second != 0) {
                    pq.emplace(curr.first, curr.second);
                }
                res++;
            }
            i++;
        }
        // 第i天之后，没有新增的苹果，只能吃之前的苹果 
        while (!pq.empty()) {
            // 过期的就扔掉
            while (!pq.empty() && pq.top().first <= i) {
                pq.pop();
            }
            // 如果都没了，那么就不吃了
            if (pq.empty()) {
                break;
            }
            
            pii curr = pq.top();
            pq.pop();
            // 剩下还能吃的苹果，min（剩下最短的日子，剩下的苹果）
            int num = min(curr.first - i, curr.second);
            res += num;
            i += num;
        }
        return res;
    }
};

int main() { return 0; }